home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / util / misc / VMM_src.lha / VMM / traphandler40.asm < prev    next >
Encoding:
Assembly Source File  |  1995-12-16  |  12.9 KB  |  389 lines

  1.                     INCLUDE   "exec/funcdef.i"
  2.                     INCLUDE   "exec/exec_lib.i"
  3.                     INCLUDE   "exec/execbase.i"
  4.                     INCLUDE   "exec/lists.i"
  5.                     INCLUDE   "exec/ports.i"
  6.                     INCLUDE   "exec/ables.i"
  7.                     INCLUDE   "shared_defs.i"
  8.                     INCLUDE   "macros.i"
  9.                     IFD       DEBUG
  10.                     INCLUDE   "exec/semaphores.i"
  11.                     ENDC
  12.  
  13.  
  14. * $Id: traphandler40.asm,v 3.6 95/12/16 18:36:30 Martin_Apel Exp $
  15.  
  16.                     IFD       DYN_MMU_SETUP
  17.                     XDEF      _DynMMUTrap40
  18.                     ELSE
  19.                     XDEF      _TrapHandler40
  20.                     ENDC
  21.  
  22.                     XREF      _PageHandlerTask
  23.                     XREF      _VM_ManagerProcess
  24.                     XREF      _PageFaultSignal
  25.                     XREF      _Free
  26.                     XREF      _PageReq
  27.                     XREF      _VirtAddrStart
  28.                     XREF      _VirtAddrEnd
  29.                     XREF      _OrigWait
  30.  
  31.                     IFD       DYN_MMU_SETUP
  32.                     XREF      _InstallMapping
  33.                     XREF      _OrigDynMMUTrap
  34.                     ELSE
  35.                     XREF      _OrigTrapHandler
  36.                     ENDC
  37.  
  38.                     IFD       DEBUG
  39.                     XREF      _EnforcerHits
  40.                     XREF      _InstructionFaults
  41.                     XREF      _FindHunk
  42.                     ENDC
  43.  
  44.                     MACHINE   MC68040
  45.  
  46. * On the 68040, VMM and Enforcer work together, because they use the
  47. * same pagesize (4K). Then address 4 (pointer to ExecBase) is mapped
  48. * as invalid. Access faults to this address should be as quick as 
  49. * possible therefore.
  50. * On the 68030, VMM and Enforcer don't work together since they use
  51. * different pagesizes, thus making the speed argument for address 4
  52. * invalid.
  53.  
  54.  
  55. FRAMESIZE_B         EQU       60
  56. FRAMESIZE_L         EQU       FRAMESIZE_B/4
  57.  
  58. SAVED_REGS          REG       d0-d1/a0-a2/a6
  59. NUM_REGS            EQU       6
  60.  
  61.                     * Offsets into the stackframe
  62. OFFS_SR             EQU       $0
  63. OFFS_PC             EQU       $2
  64. OFFS_FRAME_ID       EQU       $6
  65. OFFS_SSW            EQU       $c
  66. OFFS_WB3S           EQU       $e
  67. OFFS_WB2S           EQU       $10
  68. OFFS_WB1S           EQU       $12
  69. OFFS_FA             EQU       $14
  70. OFFS_WB3A           EQU       $18
  71. OFFS_WB3D           EQU       $1c
  72. OFFS_WB2A           EQU       $20
  73. OFFS_WB2D           EQU       $24
  74. OFFS_WB1A           EQU       $28
  75. OFFS_WB1D           EQU       $2c
  76. OFFS_PD0            EQu       $2c
  77. OFFS_PD1            EQu       $30
  78. OFFS_PD2            EQu       $34
  79. OFFS_PD3            EQu       $38
  80.  
  81.                     * Bit definitions
  82. SR_SV               EQU       5
  83. SSW_ATC             EQU       2
  84. SSW_MA              EQU       11
  85. WBS_VALID           EQU       7
  86.                     SECTION   CODE
  87.  
  88.                     IFD       DYN_MMU_SETUP
  89. _DynMMUTrap40:
  90.                     ELSE
  91. _TrapHandler40:
  92.                     ENDC
  93.  
  94.                     move.l    d0,-(sp)
  95.                     move.w    OFFS_FRAME_ID+4(sp),d0
  96.                     cmp.w     #$7008,d0
  97.                     beq       right_format
  98.                     bra       wrong_format
  99.  
  100. NoVirtMem:
  101. wrong_format:       ; restore original stack setting
  102.                     IFD       DEBUG
  103.                     move.l    OFFS_FA+4(sp),d0    ; FaultAddress
  104.                     cmpi.l    #4,d0
  105.                     beq       SysBaseAccess
  106.                     addq.l    #1,_EnforcerHits
  107.                     PRINT_DEB "EnforcerHit occurred for address %lx",d0
  108.                     move.l    OFFS_PC+4(sp),-(sp)
  109.                     jsr       _FindHunk
  110.                     addq.w    #4,sp
  111. SysBaseAccess
  112.                     ENDC
  113.                     move.l     (sp)+,d0
  114.  
  115.                     ; give it to the original handler
  116.                     IFD       DYN_MMU_SETUP
  117.                     move.l    _OrigDynMMUTrap,-(sp)
  118.                     ELSE
  119.                     move.l    _OrigTrapHandler,-(sp)
  120.                     ENDC
  121.                     rts
  122.  
  123. right_format        btst.b    #SSW_ATC,OFFS_SSW+4(sp)
  124.                     beq       wrong_format        ; ATC in SSW unset
  125.  
  126.                     move.l    OFFS_FA+4(sp),d0    ; FaultAddress
  127.  
  128.                     IFND      DYN_MMU_SETUP
  129.                     IN_VM     d0,NoVirtMem
  130.                     ENDC
  131.  
  132. ValidAddr
  133. *                    PRINT_DEB "TRAP: Fault for task %lx",ThisTask(a6)
  134.  
  135.                     move.l    (sp)+,d0
  136.                     btst.b    #SR_SV,OFFS_SR(sp)
  137.                     beq       TrapFromUserMode
  138.  
  139. TrapFromSVMode:     PRINT_DEB "*** TRAP: Called from SV mode"
  140.  
  141.                     IFD       DEBUG
  142.                     PRINT_DEB "***: ThisTask = %lx",ThisTask(a6)
  143.                     moveq     #0,d0
  144.                     move.w    OFFS_SR(sp),d0
  145.                     PRINT_DEB "***: SR = %lx",d0
  146.                     move.l    OFFS_PC(sp),d0
  147.                     PRINT_DEB "***: PC = %lx",d0
  148.                     move.l    d0,-(sp)
  149.                     jsr       _FindHunk
  150.                     add.w     #4,sp
  151.  
  152.                     move.l    OFFS_FA(sp),d0
  153.                     PRINT_DEB "***: FA = %lx",d0
  154.                     move.l    usp,a0
  155.                     PRINT_DEB "***: USP = %lx",a0
  156.                     move.l    4,a0
  157.                     PRINT_DEB "***: SysBase = %lx",a0
  158.                     PRINT_DEB "***: SSP = %lx",sp
  159.                     ENDC
  160.  
  161.                     bra       SVAlarm
  162.  
  163.                     ALIGN_LONG
  164.  
  165. TrapFromUserMode    movem.l   SAVED_REGS,-(sp)
  166.  
  167. *                    PRINT_DEB "TRAP: SV mode 1"
  168.  
  169.                     IFD       DEBUG
  170.  
  171.                     move.l    4,a6
  172.                     cmpi.b    #-1,IDNestCnt(a6)
  173.                     beq       DisableNotBroken
  174.                     PRINT_DEB "Disable broken"
  175. DisableNotBroken    cmpi.b    #-1,TDNestCnt(a6)
  176.                     beq       ForbidNotBroken
  177.  
  178.                     lea       _VirtMemSema,a0
  179.                     move.l    SS_OWNER(a0),d0
  180.                     cmp.l     ThisTask(a6),d0
  181.                     beq       ForbidNotBroken
  182. ForbidBroken        PRINT_DEB "Forbid broken"
  183. ForbidNotBroken     
  184.                     move.w    OFFS_SSW+NUM_REGS*4(sp),d0
  185.                     and.w     #$7,d0
  186.                     move.l    OFFS_FA+NUM_REGS*4(sp),a0
  187.                     cmpi.b    #2,d0
  188.                     bne       NoInstructionFault
  189. *                    PRINT_DEB "TRAP: Instruction fault at %lx",a0
  190.                     move.l    a0,-(sp)
  191. *                    jsr       _FindHunk
  192.                     add.w     #4,sp
  193.                     addq.l    #1,_InstructionFaults
  194. NoInstructionFault
  195.                     ENDC
  196.  
  197.                     lea       _Free,a0
  198.                     REMHEAD
  199.                     tst.l     d0
  200.                     move.l    d0,a2               ; does not affect CCR
  201.                     beq       SVAlarm
  202.  
  203.                     lea       TS_TmpStack+TMP_STACKSIZE(a2),a6
  204.                     move.l    usp,a0                        ; Store orig usp
  205.                     move.l    a0,-(a6)
  206.                     lea       FRAMESIZE_B+NUM_REGS*4(sp),a1
  207.                     moveq     #FRAMESIZE_L-1,d0
  208. copy_frame:         move.l    -(a1),-(a6)
  209.                     dbra      d0,copy_frame
  210.  
  211.                     lea       NUM_REGS*4(sp),a1
  212.                     moveq     #NUM_REGS-1,d0
  213. copy_reglist        move.l    -(a1),-(a6)
  214.                     dbra      d0,copy_reglist
  215.  
  216.                     move.l    a6,usp
  217.  
  218.                     lea       FRAMESIZE_B+NUM_REGS*4(sp),sp ; destroy frame
  219.  
  220.                     andi.w    #$dfff,sr                     ; switch to
  221.                                                             ; user mode
  222.                     * Tmp stack format is now
  223.                     * high:  | orig_usp
  224.                     *        | stack frame
  225.                     * low:   | SAVED_REGS
  226.  
  227.  
  228. *                    PRINT_DEB "TRAP: User mode 1"
  229.  
  230.                     move.l    4,a6
  231.                     move.l    NUM_REGS*4+OFFS_FA(sp),d0
  232.                     btst.b    #SSW_MA-8,OFFS_SSW+NUM_REGS*4(sp)
  233.                     beq       NotMisaligned
  234.  
  235.                     PRINT_DEB "Misaligned fault. Address = %lx",d0
  236.                     add.l     #(PAGESIZE-1),d0
  237.                     and.w     #~(PAGESIZE-1),d0        ; ALIGN_UP
  238.  
  239.                     IFD       DEBUG
  240.                     move.w    OFFS_SSW+NUM_REGS*4(sp),a1
  241.                     PRINT_DEB "SSW = %lx",a1
  242.                     ENDC
  243.  
  244. NotMisaligned       move.l    d0,TS_FaultAddress(a2)
  245. *                    PRINT_DEB "FaultAddress = %lx",TS_FaultAddress(a2)
  246.                     move.l    ThisTask(a6),TS_FaultTask(a2)
  247.  
  248.                     lea       NUM_REGS*4(sp),a1
  249.                     move.l    a1,TS_TopOfStackFrame(a2)
  250.  
  251.                     IFND      DYN_MMU_SETUP
  252.                     GET_SIGNAL
  253.                     ext.b     d0
  254.                     move.w    d0,TS_WakeupSignal(a2)
  255.  
  256.                     lea       _PageReq,a0
  257.                     move.l    a2,a1
  258.                     FORBID
  259.                     ADDTAIL
  260.                     PERMIT
  261.  
  262.                     move.w    _PageFaultSignal,d1
  263.                     moveq     #1,d0
  264.                     move.l    _PageHandlerTask,a1
  265.                     lsl.l     d1,d0
  266.                     jsr       _LVOSignal(a6)
  267.  
  268.                     moveq     #1,d0
  269.                     move.w    TS_WakeupSignal(a2),d1
  270.                     lsl.l     d1,d0
  271.  
  272. *                    PRINT_DEB "TRAP: User mode 2"
  273.  
  274.                     move.l    _OrigWait,a0
  275.                     jsr       (a0)            ; no need to go through patch
  276.  
  277.                     * Page is back
  278.  
  279. *                    PRINT_DEB "TRAP: User mode 3"
  280.  
  281.                     move.w    TS_WakeupSignal(a2),d0
  282.                     RELEASE_SIGNAL
  283.  
  284.                     ELSE      ; DYN_MMU_SETUP
  285.  
  286.                     move.l    TS_FaultAddress(a2),-(sp)
  287.                     jsr       _InstallMapping
  288.                     add.w     #4,sp
  289.  
  290.                     ENDC
  291.  
  292.                     * Complete possible write-backs here
  293.  
  294.                     move.l    TS_TopOfStackFrame(a2),a0
  295.  
  296.                     IFD       DEBUG
  297.                     move.w    OFFS_SSW(a0),d0
  298.                     and.w     #$1f,d0
  299.                     bne       NoCachePush
  300.  
  301.                     PRINT_DEB "TRAP: Doing pushback"
  302.  
  303.                     move.l    OFFS_FA(a0),a1
  304.                     move.l    OFFS_PD0(a0),(a1)+
  305.                     move.l    OFFS_PD1(a0),(a1)+
  306.                     move.l    OFFS_PD2(a0),(a1)+
  307.                     move.l    OFFS_PD3(a0),(a1)+
  308. NoCachePush
  309.                     ENDC
  310.  
  311.                     move.b    OFFS_WB2S+1(a0),d1
  312.                     move.l    OFFS_WB2D(a0),d0
  313.                     move.l    OFFS_WB2A(a0),a1
  314.                     bsr       DoWriteBack
  315.  
  316.                     move.b    OFFS_WB3S+1(a0),d1
  317.                     move.l    OFFS_WB3D(a0),d0
  318.                     move.l    OFFS_WB3A(a0),a1
  319.                     bsr       DoWriteBack
  320.  
  321.                     move.l    a5,-(sp)                 ; UserStack
  322.                     lea       PageIsBack(pc),a5
  323.                     jmp       _LVOSupervisor(a6)
  324.  
  325.  
  326.                     ALIGN_LONG
  327. PageIsBack:        * PRINT_DEB "TRAP: SV mode 2"
  328.  
  329.                     add.w     #8,sp                    ; take Supervisor
  330.                     move.l    usp,a6                   ; stackframe from stack
  331.                     move.l    (a6)+,a5
  332.  
  333.                     ; copy stack frame from user stack
  334.                     lea       FRAMESIZE_B+NUM_REGS*4(a6),a1
  335.                     moveq     #FRAMESIZE_L-1,d0
  336. copy_frame2:        move.l    -(a1),-(sp)
  337.                     dbra      d0,copy_frame2
  338.  
  339.                     move.l    FRAMESIZE_B+NUM_REGS*4(a6),a0  ; orig USP
  340.                     move.l    a0,usp
  341.  
  342.                     lea       _Free,a0
  343.                     move.l    a2,a1
  344.                     ADDTAIL
  345.  
  346. *                    PRINT_DEB "TRAP: SV mode 3"
  347.  
  348.                     movem.l   (a6),SAVED_REGS
  349.                     rte
  350.  
  351. **********************************************************************
  352.  
  353.                     ALIGN_LONG
  354. DoWriteBack:        * called with:
  355.                     * d0   : WBData
  356.                     * a1   : WBAddress
  357.                     * d1.b : WBStatus
  358.  
  359.                     btst.l    #WBS_VALID,d1
  360.                     beq       NoWriteBack
  361.  
  362.                     and.b     #$60,d1
  363.                     tst.b     d1
  364.                     bne       NoLongWB
  365.                     move.l    d0,(a1)
  366. NoWriteBack         rts
  367.  
  368.                     ALIGN_LONG
  369. NoLongWB            cmpi.b    #$40,d1
  370.                     bne       NoWordWB
  371.                     move.w    d0,(a1)
  372.                     rts
  373.  
  374.                     ALIGN_LONG
  375. NoWordWB            move.b    d0,(a1)
  376.                     rts
  377.  
  378. ********************************************************************
  379.  
  380. SVAlarm:            PRINT_DEB "TRAP: SV alarm"
  381.  
  382.                     move.l    4,a6
  383.                     move.l    #NoTrapStructsAlertNum,d7
  384.                     jmp       _LVOAlert(a6)
  385.  
  386. ********************************************************************
  387.  
  388.                    end
  389.